package me.helllp.book.jvm.ch03;

/**
 * 拯救对象的方法
 * 1. 对象在GC时候自救
 * 2. 对象自救只有一次机会，因为一个对象的finalize()方法只执行一次
 * 
 * @author linxm
 *
 */
public class FinalizeEspaceGC {
    public static FinalizeEspaceGC SAVE_HOOK = null;
    
    public void isAlive(){
        System.out.println("我还活着！");
    }
    
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize方法被执行了！");
        SAVE_HOOK = this;
    }
    
    public static void main(String[] args) throws InterruptedException {
        SAVE_HOOK = new FinalizeEspaceGC();
        SAVE_HOOK = null;
        
        //  第一次拯救自己
        System.gc();
        //  因为finalize方法优先级比较低，暂停一会
        Thread.sleep(1000);
        
        if(SAVE_HOOK == null){
            System.out.println("拯救自己失败");
        }else{
            SAVE_HOOK.isAlive();
        }
        
        SAVE_HOOK = null;
        
        //  第二次拯救自己
        System.gc();
        //  因为finalize方法优先级比较低，暂停一会
        Thread.sleep(1000);
        
        if(SAVE_HOOK == null){
            System.out.println("拯救自己失败");
        }else{
            SAVE_HOOK.isAlive();
        }
    }
}
